/**
 * @description 客户端控制工具方法
 * @author maple
 * */
import {BaseDirectory, exists, mkdir, writeFile, writeTextFile, remove, readDir} from "@tauri-apps/plugin-fs";
import {save} from "@tauri-apps/plugin-dialog";
import {ElMessage} from "element-plus";
import {listToTree, getDate} from "./utils.js";
import { useSystemStore } from "../store/index.js";
import {useFileStore} from "../store/fileStore.js";

/**
 * 根据系统设置生成带前缀的文件名
 * @param {String} originalFileName - 原始文件名
 * @param {Object} systemStore - 系统状态存储
 * @returns {String} 处理后的文件名
 */
function generateFileNameWithPrefix(originalFileName, systemStore) {
	const { newFileNamePrefix, newFileNamePrefixText } = systemStore;
	
	// 前缀类型映射
	const prefixMap = {
		'date': () => getDate(),
		'datetime': () => getDate('datetime'),
		'custom': () => newFileNamePrefixText || ''
	};
	
	// 获取前缀生成函数
	const prefixGenerator = prefixMap[newFileNamePrefix];
	
	// 如果没有匹配的前缀类型或为空，直接返回原文件名
	if (!prefixGenerator || !newFileNamePrefix || newFileNamePrefix === 'none') {
		return originalFileName;
	}
	
	// 生成前缀并组合文件名
	const prefix = prefixGenerator();
	return prefix ? `${prefix}-${originalFileName}` : originalFileName;
}

/**
 * 创建文件方法
 * @param {String} fileName - 文件名
 * @param {String} filePath - 文件路径
 * @return {String} 文件路径
 * */
async function createNewFile(fileName, filePath) {
	try {
		if (!fileName) {
			ElMessage.warning('请输入文件名！');
			return;
		}
		
		// 根据系统设置处理文件名前缀
		const systemStore = useSystemStore();
		fileName = generateFileNameWithPrefix(fileName, systemStore);
		if (!filePath || filePath.trim() === '') {
			// 文件路径不存在则弹窗选择保存地点
			const selectFilePath = await save({
				canCreateDirectories: true,
				title: '保存文件',
				filters: [{
					name: 'md',
					extensions: ['md']
				}],
				defaultPath: fileName + '.md'
			});
			await writeTextFile(selectFilePath, '');
			ElMessage.success('创建成功！');
			return selectFilePath;
		}

		const path = filePath + '\\' + fileName + '.md';
		const hasFile = await exists(path);
		if (hasFile) {
			ElMessage.warning('当前文件已存在，请重新创建！');
			return;
		}
		console.log('path: ', path)
		await writeTextFile(path, '');
		ElMessage.success('创建成功！');
		return path;
	} catch (e) {
		console.warn('创建文件报错: ', e);
		ElMessage.error('创建失败！');
	}
}

/**
 * 创建文件夹方法
 * @param {String} folderName - 文件夹名
 * @param {String} folderPath - 文件夹路径
 * */
async function createNewFolder(folderName, folderPath) {
	try {
		if (!folderName) {
			ElMessage.warning('请输入文件夹名！');
			return;
		}
		if (!folderPath || folderPath.trim() === '') {
			// 文件夹路径不存在则手动选择
			const selectFolderPath = await save({
				canCreateDirectories: true,
				title: '保存文件夹',
				defaultPath: folderName
			});
			await mkdir(selectFolderPath);
			ElMessage.success('创建成功！');
			return selectFolderPath;
		}

		const path = folderPath + '\\' + folderName;
		const hasFolder = await exists(path);
		if (hasFolder) {
			ElMessage.warning('当前文件夹已存在，请重新创建！');
			return;
		}
		await mkdir(path);
		ElMessage.success('创建成功！');
		return path;
	} catch (e) {
		console.warn('创建文件夹报错: ', e);
		ElMessage.error('创建失败！');
	}
}


/**
 * 查询文件夹下的文件列表
 * @param {String} folderPath - 文件夹路径
 * */
async function getFolderFileList(folderPath) {
	try {
		if (!folderPath) {
			ElMessage.warning('请选择文件夹路径！');
			return;
		}
		// 检查文件夹是否存在
		const hasFile = await exists(folderPath);
		if (!hasFile) {
			ElMessage({
				message: '当前选择文件夹不存在，请重新选择!',
				type: 'warning',
			})
			return;
		}
		return await readDir(folderPath);
	} catch (e) {
		console.warn('查询文件夹下的文件列表报错: ', e);
		ElMessage.error('查询失败！');
	}
}

/**
 * 保存数据到文件
 * @param {String} data - 数据
 * @param {String} filePath - 文件路径
 * */
async function saveDataToFile(data, filePath) {
	try {
		if (!data || data.trim() === '') {
			ElMessage.warning('请输入数据！');
			return;
		}
		if (!filePath) {
			ElMessage.warning('请选择文件路径！');
			return;
		}
		const hasFile = await exists(filePath);
		if (!hasFile) {
			ElMessage.warning('当前文件不存在，请重新选择！');
			return;
		}
		await writeTextFile(filePath, data);
		ElMessage.success('保存成功！');
	} catch (e) {
		ElMessage.error('保存失败！');
	}
}

/**
 * 删除文件/文件夹
 * @param {String} path - 路径
 * */
async function deleteFile(path) {
	try {
		if (!path) {
			ElMessage.warning('请选择文件路径！');
			return;
		}
		await remove(path, {recursive: true});
		ElMessage.success('删除成功！');
	} catch (e) {
		console.warn('删除文件报错: ', e);
		ElMessage.error('删除失败！');
	}
}

/**
 * 更新文件列表
 * @param {String} path - 文件路径
 * */
async function updateFileList(path) {
	const fileStore = useFileStore();
	const fileList = await getFolderFileList(path);
	const fileTree = listToTree(fileList, path);
	fileStore.setFileTreeList(fileTree);
}

export {
	createNewFile,
	createNewFolder,
	getFolderFileList,
	saveDataToFile,
	deleteFile,
	updateFileList,
	generateFileNameWithPrefix
}

